package the.lb.workbench.auth.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ByteSource;
import the.lb.workbench.auth.po.AuthUser;

/**
 * Shiro 工具类
 */
public class ShiroUtils {

    /**
     * 加盐参数
     */
    public final static String hashAlgorithmName = "MD5";

    /**
     * 循环次数
     */
    public final static int hashIterations = 1024;

    /**
     * 获取当前 Subject
     * @return  subject
     */
    public static Subject getSubject() {
        return SecurityUtils.getSubject();
    }

    public static AuthUser getUser() {
        if (isGuest()) {
            return null;
        }
        return (AuthUser) getSubject().getPrincipals().getPrimaryPrincipal();
    }

    /**
     * 认证通过或已记住的用户。与 Guset 搭配使用。
     *
     * @return 用户：true，否则 false
     */
    public static boolean isUser() {
        return getSubject() != null && getSubject().getPrincipal() != null;
    }

    /**
     * 验证当前用户是否为“访客”，即未认证（包含未记住）的用户。用user搭配使用
     *
     * @return 访客：true，否则false
     */
    public static boolean isGuest() {
        return !isUser();
    }

    /**
     * shiro密码加密工具类
     *
     * @param credentials 密码
     * @param saltSource  密码盐
     * @return
     */
    public static String md5(String credentials, String saltSource) {
        ByteSource salt = new Md5Hash(saltSource);
        return new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations).toString();
    }

    public static void main(String[] args) {
        System.out.println(md5("123456", "wisteria"));
    }
}
